(75%)О =, == и ===
Смотрим разницу.
Правильная проверка на равенство:
if(x==y)printf("x raven y");
выполняет печать, если x равен y.
Посмотрим, что будет, если пропустить один знак равенства:
if(x=y)printf("x raven y");
Теперь в скобках стоит присваивание. В x записывается значение y, и это значение является результатом присваивания. Оператором if оно воспринимается как логическое (0 / не 0). Таким образом, печать происходит, если y не 0, что явно неверно. Кроме того, мы испортили x.
Если вы пропустите один знак равенства в своей программе, компилятор выдаст предупреждение ("возможно, неверное присваивание"), но программа запустится. Читайте предупреждения!
Программа запустится - потому что компилятор считает, что вы знаете, что делаете.
Иногда присваивание в условии - именно то, что нужно, например:
if(f=fopen("имя_файла"))
Здесь условие срабатывает, если файл успешно открылся, при этом открытый поток присваивается переменной f для дальнейшего использования.
А что же насчет ===?
Вам повезло. В языке С такой конструкции нет. ;)
Смотрим разницу.
Правильная проверка на равенство:
выполняет печать, если x равен y.
Посмотрим, что будет, если пропустить один знак равенства:
Теперь в скобках стоит присваивание. В x записывается значение y, и это значение является результатом присваивания. Оператором if оно воспринимается как логическое (0 / не 0). Таким образом, печать происходит, если y не 0, что явно неверно. Кроме того, мы испортили x.
Если вы пропустите один знак равенства в своей программе, компилятор выдаст предупреждение ("возможно, неверное присваивание"), но программа запустится. Читайте предупреждения!
Программа запустится - потому что компилятор считает, что вы знаете, что делаете.
Иногда присваивание в условии - именно то, что нужно, например:
Здесь условие срабатывает, если файл успешно открылся, при этом открытый поток присваивается переменной f для дальнейшего использования.
А что же насчет ===?
Вам повезло. В языке С такой конструкции нет. ;)